//
//  BCWeakTimer.h
//  BCFoundation
//
//  Created by chun.chen on 2020/9/23.
//  GCD 线程安全Timer

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface BCWeakTimer : NSObject

/// 容忍度，单位秒，默认为 0.1；即便设置为 0.0 仍然存在误差 @note:由于系统底层的调度优化关系，当我们使用定时器调用fired的时候并不能立马就能运行的。可能马上运行，也可能需要等一段时间（如果当前CPU忙着做别的事情）。当时我们可以设置一个最大等待时间。
@property (atomic, assign) NSTimeInterval tolerance;

/// 调用时间间隔
@property (readonly) NSTimeInterval interval;

/// 用户信息
@property (readonly) id _Nullable userInfo;


/// 创建一个定时器并启动
/// @param timeInterval 间隔
/// @param target 目标
/// @param selector 函数
/// @param userInfo 信息
/// @param repeats 是否重复
/// @param dispatchQueue 派发事件的队列，可以是串行队列或并发队列
+ (instancetype)timerWithTimeInterval:(NSTimeInterval)timeInterval
                                        target:(id)target
                                      selector:(SEL)selector
                                      userInfo:(nullable id)userInfo
                                       repeats:(BOOL)repeats
                                 dispatchQueue:(nullable dispatch_queue_t)dispatchQueue;


/// 创建一个定时器并启动
/// @param timeInterval 间隔
/// @param userInfo 信息
/// @param repeats 是否重复
/// @param dispatchQueue 派发事件的队列，可以是串行队列或并发队列
/// @param block  定时器事件
+ (instancetype)timerWithTimeInterval:(NSTimeInterval)timeInterval
                                     userInfo:(nullable id)userInfo
                                      repeats:(BOOL)repeats
                                dispatchQueue:(dispatch_queue_t)dispatchQueue
                                        block:(void (^)(BCWeakTimer *timer))block;


/// 启用定时器
- (void)fire;

/// 无效定时器
/// @note 调用该方法之后，将无法重启定时器
/// @note 如果是用 target selector 方式启用的定时器，target 销毁之后的第一次调用 selector 的时机会自动调用本方法
- (void)invalidate;

/// 暂停定时器
/// @note 调用本方法之后，可以用 fire 重启定时器
- (void)pause;

@end

NS_ASSUME_NONNULL_END
